import numpy as np

### 三、ndarray的基本操作
n = np.random.randint(0, 100, size=(3, 4, 2))
# 这里逗号是维度的分割
print(n)
print(n[1, 2, 0])
## 1、索引
n[1, 2, 0] = 44  # 赋值
## 2、切片
print(n[1:3])  # print(n[1:3,])
print(n[1:3, 1:3, 0:1])
# 反转
print(n[::-1, :, ::-1])  # 将数据反转, 这是将第1个维度和第3个维度反转. 应用比如图片的反转, 左右 上下 颜色
## 3、变形，注：reshape要求总数一致，即size一致
n = n.reshape(4, 3, 2)
print(n)
## 4、级联
n1 = np.random.randint(0, 100, size=(2, 3))
n2 = np.random.randint(0, 100, size=(3, 3))
n3 = np.random.randint(0, 100, size=(2, 2))
# 垂直级联，要求列数一致
print(np.concatenate([n1, n2], axis=0))
print(np.vstack((n1, n2)))  # 传入一个tuple
# 水平级联，要求行数一致
print(np.concatenate([n1, n3], axis=1))
print(np.hstack((n1, n3)))  # 传入一个tuple
## 5、切分
# 对ary，沿着axis轴进行切分，返回list
print(np.split(ary=n, indices_or_sections=[1, 2], axis=1))
# axis=0
print(np.vsplit(ary=n, indices_or_sections=[1, 2]))
# axis=1
print(np.hsplit(ary=n, indices_or_sections=[1, 2]))
## 6、副本
# 所有赋值运算不会为ndarray的任何元素创建副本，对赋值后的对象操作也对原来你的对象生效。
# 可使用copy()函数创建副本
n4 = n.copy()  # 是个深拷贝
n5 = n.view()  # 是个浅拷贝，没用过

l = [i for i in range(100000)]
print(l.__sizeof__())  # 824440 查看内存
print(np.array(l).__sizeof__())  # 400112 比列表小一倍
